--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / frontend / js / rnode / AndroidBridge.js
Displaying Raw • Download
meshchatx/src/frontend/js/rnode/AndroidBridge.js e0f1f99cd1c208c5008a936230c38e448dddd45d (e0f1f99c) Text, 8.24 KB
T8b949e/**
* Thin JS wrapper around the native MeshChatXAndroid bridge.
*
* The bridge methods are added by the Android WebView side
* (see android/app/src/main/java/com/meshchatx/MainActivity.java).
* Each method may be missing on older builds, so all helpers degrade
* gracefully and return safe defaults.
*
* The wrapper is also fully testable: a custom bridge object can be
* injected via the constructor.
*/
Tff7b72const Te6edf3PERM_BLUETOOTH Tff7b72= Ta5d6ff"bluetooth"Tb4b4b4;
Tff7b72const Te6edf3PERM_USB Tff7b72= Ta5d6ff"usb"Tb4b4b4;
Tff7b72function Te6edf3pickEnvTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72typeof Tffa657window Tff7b72!== Ta5d6ff"undefined"Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657windowTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72typeof Tffa657globalThis Tff7b72!== Ta5d6ff"undefined"Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657globalThisTb4b4b4;
Tb4b4b4}
Tff7b72return Tb4b4b4{Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72function Te6edf3safeCallTb4b4b4(Te6edf3fnTb4b4b4, Te6edf3fallbackTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3result Tff7b72= Te6edf3fnTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3result Tff7b72=== Tff7b72undefined Tff7b72? Te6edf3fallback Tff7b72: Te6edf3resultTb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
Tff7b72return Te6edf3fallbackTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72export Tff7b72default Tff7b72class Te6edf3AndroidBridge Tb4b4b4{
Tff7b72constructorTb4b4b4(Te6edf3bridge Tff7b72= Tff7b72nullTb4b4b4, Te6edf3env Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3env Tff7b72= Te6edf3env Tff7b72|| Te6edf3pickEnvTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3bridge Tff7b72= Te6edf3bridge Tff7b72|| Tff7b72thisTb4b4b4.Te6edf3envTb4b4b4.Te6edf3MeshChatXAndroid Tff7b72|| Tff7b72nullTb4b4b4;
Tb4b4b4}
Te6edf3isAvailableTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tffa657BooleanTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Check whether a runtime permission group is currently granted on the
* Android host. Returns true on non-android (no-op) so calling code
* can chain checks without branching.
*/
Te6edf3hasPermissionTb4b4b4(Te6edf3permissionGroupTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3permissionGroup Tff7b72=== Te6edf3PERM_BLUETOOTH Tff7b72&& Tff7b72typeof Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3hasBluetoothPermissions Tff7b72=== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3safeCallTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tffa657BooleanTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3hasBluetoothPermissionsTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3permissionGroup Tff7b72=== Te6edf3PERM_USB Tff7b72&& Tff7b72typeof Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3hasUsbPermissions Tff7b72=== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3safeCallTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tffa657BooleanTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3hasUsbPermissionsTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
T8b949e/**
* Request a runtime permission group from Android.
* Resolves to a status string: granted | requested | settings | unsupported | true (legacy).
*/
Tff7b72async Te6edf3requestPermissionTb4b4b4(Te6edf3permissionGroupTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff"granted"Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3permissionGroup Tff7b72=== Te6edf3PERM_BLUETOOTH Tff7b72&& Tff7b72typeof Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3requestBluetoothPermissions Tff7b72=== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3safeCallTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3result Tff7b72= Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3requestBluetoothPermissionsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3result Tff7b72=== Ta5d6ff"string"Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3resultTb4b4b4;
Tb4b4b4}
Tff7b72return Ta5d6ff"requested"Tb4b4b4;
Tb4b4b4}Tb4b4b4, Ta5d6ff"unsupported"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3permissionGroup Tff7b72=== Te6edf3PERM_USB Tff7b72&& Tff7b72typeof Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3requestUsbPermissions Tff7b72=== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3safeCallTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3result Tff7b72= Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3requestUsbPermissionsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3result Tff7b72=== Ta5d6ff"string"Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3resultTb4b4b4;
Tb4b4b4}
Tff7b72return Ta5d6ff"requested"Tb4b4b4;
Tb4b4b4}Tb4b4b4, Ta5d6ff"unsupported"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Ta5d6ff"unsupported"Tb4b4b4;
Tb4b4b4}
Te6edf3hasAndroidSerialTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3hasNativeRNodeFlasherTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3hasNativeRNodeFlasherTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3bridge Tff7b72|| Tff7b72typeof Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3hasNativeRNodeFlasher Tff7b72!== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3safeCallTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tffa657BooleanTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3hasNativeRNodeFlasherTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3openRNodeFlasherTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3bridge Tff7b72|| Tff7b72typeof Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3openRNodeFlasher Tff7b72!== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3safeCallTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3openRNodeFlasherTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}Tb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3openBluetoothSettingsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3bridge Tff7b72|| Tff7b72typeof Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3openBluetoothSettings Tff7b72!== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3safeCallTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3openBluetoothSettingsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}Tb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3openUsbSettingsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3bridge Tff7b72|| Tff7b72typeof Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3openUsbSettings Tff7b72!== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3safeCallTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3openUsbSettingsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}Tb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3getPlatformTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3bridge Tff7b72|| Tff7b72typeof Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3getPlatform Tff7b72!== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3safeCallTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3getPlatformTb4b4b4(Tb4b4b4)Tb4b4b4, Tff7b72nullTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Host battery status JSON string from the Android WebView bridge.
* Returns null when unavailable.
*/
Te6edf3getBatteryStatusTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3bridge Tff7b72|| Tff7b72typeof Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3getBatteryStatus Tff7b72!== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3safeCallTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3getBatteryStatusTb4b4b4(Tb4b4b4)Tb4b4b4, Tff7b72nullTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3getSidebandPluginsDefaultPathTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3bridge Tff7b72|| Tff7b72typeof Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3getSidebandPluginsDefaultPath Tff7b72!== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3safeCallTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3getSidebandPluginsDefaultPathTb4b4b4(Tb4b4b4)Tb4b4b4, Tff7b72nullTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Opens the system share sheet with the installed APK (Bluetooth, Nearby Share, etc.).
* No-op when bridge or method is missing.
*/
Te6edf3shareApkTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3bridge Tff7b72|| Tff7b72typeof Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3shareApk Tff7b72!== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3safeCallTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3shareApkTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}Tb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Whether FLAG_SECURE is enabled (blocks screenshots and recent-app previews).
* Defaults to false when the bridge method is missing.
*/
Te6edf3getBlockScreenshotsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3bridge Tff7b72|| Tff7b72typeof Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3getBlockScreenshots Tff7b72!== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3safeCallTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tffa657BooleanTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3getBlockScreenshotsTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3setBlockScreenshotsTb4b4b4(Te6edf3enabledTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3bridge Tff7b72|| Tff7b72typeof Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3setBlockScreenshots Tff7b72!== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3safeCallTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3setBlockScreenshotsTb4b4b4(Tffa657BooleanTb4b4b4(Te6edf3enabledTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}Tb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Whether the primary clipboard is cleared when the app goes to the background.
* Defaults to false when the bridge method is missing.
*/
Te6edf3getClearClipboardOnBackgroundTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3bridge Tff7b72|| Tff7b72typeof Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3getClearClipboardOnBackground Tff7b72!== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3safeCallTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tffa657BooleanTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3getClearClipboardOnBackgroundTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3setClearClipboardOnBackgroundTb4b4b4(Te6edf3enabledTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3bridge Tff7b72|| Tff7b72typeof Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3setClearClipboardOnBackground Tff7b72!== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3safeCallTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3setClearClipboardOnBackgroundTb4b4b4(Tffa657BooleanTb4b4b4(Te6edf3enabledTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}Tb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Configured remote backend URL, or empty string for the on-device local backend.
*/
Te6edf3getRemoteBackendUrlTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3bridge Tff7b72|| Tff7b72typeof Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3getRemoteBackendUrl Tff7b72!== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff""Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3safeCallTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tffa657StringTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3getRemoteBackendUrlTb4b4b4(Tb4b4b4) Tff7b72|| Ta5d6ff""Tb4b4b4)Tb4b4b4, Ta5d6ff""Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3getEffectiveBackendUrlTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3bridge Tff7b72|| Tff7b72typeof Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3getEffectiveBackendUrl Tff7b72!== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3safeCallTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3getEffectiveBackendUrlTb4b4b4(Tb4b4b4)Tb4b4b4, Tff7b72nullTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3isRemoteBackendTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3bridge Tff7b72|| Tff7b72typeof Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3isRemoteBackend Tff7b72!== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3safeCallTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tffa657BooleanTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3isRemoteBackendTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Persist remote backend URL and restart the Android shell.
* Empty string clears to local. Returns ok | invalid | unchanged | unsupported.
*/
Te6edf3setRemoteBackendUrlAndRestartTb4b4b4(Te6edf3urlTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3bridge Tff7b72|| Tff7b72typeof Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3setRemoteBackendUrlAndRestart Tff7b72!== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff"unsupported"Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3safeCallTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3result Tff7b72= Tff7b72thisTb4b4b4.Te6edf3bridgeTb4b4b4.Te6edf3setRemoteBackendUrlAndRestartTb4b4b4(Te6edf3url Tff7b72== Tff7b72null Tff7b72? Ta5d6ff"" Tff7b72: Tffa657StringTb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72typeof Te6edf3result Tff7b72=== Ta5d6ff"string" Tff7b72? Te6edf3result Tff7b72: Ta5d6ff"unsupported"Tb4b4b4;
Tb4b4b4}Tb4b4b4, Ta5d6ff"unsupported"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Te6edf3AndroidBridgeTb4b4b4.Te6edf3PERM_BLUETOOTH Tff7b72= Te6edf3PERM_BLUETOOTHTb4b4b4;
Te6edf3AndroidBridgeTb4b4b4.Te6edf3PERM_USB Tff7b72= Te6edf3PERM_USBTb4b4b4;
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────